var formatJson = function(json, options) {
    var reg = null,
    formatted = '',
    pad = 0,
    PADDING = '    '; // one can also use '\t' or a different number of spaces
   
    // optional settings
    options = options || {};
    // remove newline where '{' or '[' follows ':'
    options.newlineAfterColonIfBeforeBraceOrBracket = (options.newlineAfterColonIfBeforeBraceOrBracket === true) ? true : false;
    // use a space after a colon
    options.spaceAfterColon = (options.spaceAfterColon === false) ? false : true;
   
    // begin formatting...
    if (typeof json !== 'string') {
        // make sure we start with the JSON as a string
        json = JSON.stringify(json);
    } else {
        // is already a string, so parse and re-stringify in order to remove extra whitespace
        json = JSON.parse(json);
        json = JSON.stringify(json);
    }
   
    // add newline before and after curly braces
    reg = /([\{\}])/g;
    json = json.replace(reg, '\r\n$1\r\n');
   
    // add newline before and after square brackets
    reg = /([\[\]])/g;
    json = json.replace(reg, '\r\n$1\r\n');
   
    // add newline after comma
    reg = /(\,)/g;
    json = json.replace(reg, '$1\r\n');
   
    // remove multiple newlines
    reg = /(\r\n\r\n)/g;
    json = json.replace(reg, '\r\n');
   
    // remove newlines before commas
    reg = /\r\n\,/g;
    json = json.replace(reg, ',');
   
    // optional formatting...
    if (!options.newlineAfterColonIfBeforeBraceOrBracket) {       
        reg = /\:\r\n\{/g;
        json = json.replace(reg, ':{');
        reg = /\:\r\n\[/g;
        json = json.replace(reg, ':[');
    }
    if (options.spaceAfterColon) {        
        reg = /\:/g;
        json = json.replace(reg, ': ');
    }
   
    $.each(json.split('\r\n'), function(index, node) {
        var i = 0,
            indent = 0,
            padding = '';
   
        if (node.match(/\{$/) || node.match(/\[$/)) {
            indent = 1;
        } else if (node.match(/\}/) || node.match(/\]/)) {
            if (pad !== 0) {
                pad -= 1;
            }
        } else {
            indent = 0;
        }
   
        for (i = 0; i < pad; i++) {
            padding += PADDING;
        }
   
        formatted += padding + node + '\r\n';
        pad += indent;
    });
   
    return formatted;
};

// json数据格式化
function formatJson2(txt, compress, isDecodeUnicode) {
    var indentChar = ' ';
    if (/^\s*$/.test(txt)) {
        alert('数据为空,无法格式化! ');
        return txt;
    }
    try {
        var data = eval('(' + txt + ')');
    } catch (e) {
        alert('数据源语法错误,格式化失败! 错误信息: ' + e.description, 'err');
        return txt;
    }
    
    var draw = [],
    last = false,
    This = this,
    line = compress ? '' : '\n', nodeCount = 0, maxDepth = 0;
    var notify = function(name, value, isLast, indent, formObj) {
        nodeCount++;/* 节点计数 */
        for (var i = 0, tab = ''; i < indent; i++) {
            tab += indentChar;/* 缩进HTML */
        }
        tab = compress ? '' : tab;/* 压缩模式忽略缩进 */
        maxDepth = ++indent;/* 缩进递增并记录 */
        if (value && value.constructor == Array) {/* 处理数组 */
            draw.push(tab + (formObj ? ('"' + name + '":') : '') + '[' + line);
            for (var i = 0; i < value.length; i++) {
                notify(i, value[i], i == value.length - 1, indent, false);
            }
            draw.push(tab + ']' + (isLast ? line : (',' + line)));/* 缩进']'换行,若非尾元素则添加逗号 */
        } else if (value && typeof value == 'object') {/* 处理对象 */
            draw.push(tab + (formObj ? ('"' + name + '":') : '') + '{' + line);
            var len = 0, i = 0;
            for ( var key in value) {
                len++;
            }
            for ( var key in value) {
                notify(key, value[key], ++i == len, indent, true);
            }
            draw.push(tab + '}' + (isLast ? line : (',' + line)));/* 缩进'}'换行,若非尾元素则添加逗号 */
        } else {
            if (typeof value == 'string') {
                if (isDecodeUnicode == true) {
                    value = decodeUnicode(value);
                } else {
                    value = encodeUnicode(value);
                }
                value = '"' + value + '"';
            }
            draw.push(tab + (formObj ? ('"' + name + '":') : '') + value + (isLast ? '' : ',') + line);
        }
    };
    var isLast = true, indent = 0;
    notify('', data, isLast, indent, false);
    return draw.join('');
}

function encodeUnicode(str) {
    var res = [];
    for (var i = 0; i < str.length; i++) {
        res[i] = ( "00" + str.charCodeAt(i).toString(16) ).slice(-4);
    }
    return "\\u" + res.join("\\u");
}
function decodeUnicode(str) { 
    str = str.replace(/\\/g, "%");
    return unescape(str);
}